package com.example.demofx.master;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.SVGPath;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.net.URL;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.Optional;

public class ContactWindow extends Application {

    private ContactManager contactManager;
    private Contact currentContact;
    private boolean isEditMode = false;
    private ContactSavedListener contactSavedListener;
    // 存储所有输入控件的引用，方便切换编辑模式
    private List<TextField> textFields = new ArrayList<>();
    private ListView<String> contactType;
    private DatePicker birthPicker;
    private ImageView avatarImg; // 新增图片显示控件
    private TextArea noteTextArea; // 新增 TextArea 成员变量
    private Button selectPhotoBtn;
    private SVGPath starIcon; // 星标图标
    private GridPane infoGrid; // 声明为成员变量
    private Map<String, StringProperty> PLATFORM_PROPERTIES;
    private List<TextField> accountFields = new ArrayList<>(); // 存储编辑模式下的账号输入框
    private PhotoLoader photoLoader;//照片加载器
    private ProgressIndicator photoLoadingIndicator;
    private Stage primaryStage;

    // 存储按钮引用
    private Button editBtn;
    private Button favoriteBtn;
    private Button deleteBtn;
    private Button saveBtn;

    public ContactWindow(ContactManager contactManager) {
        this.contactManager = contactManager;
        contactType = new ListView<>();
        // 初始化 PLATFORM_PROPERTIES
        if (currentContact != null) {
            initPlatformProperties();
        }
    }

    public ContactWindow() {
        contactType = new ListView<>();
        // 初始化 PLATFORM_PROPERTIES
        if (currentContact != null) {
            initPlatformProperties();
        }
    }

    // 设置联系人保存监听器
    public void setContactSavedListener(ContactSavedListener listener) {
        this.contactSavedListener = listener;
    }

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        // 初始化联系人管理器
        contactManager = new ContactManager();
        String cacheDir = System.getProperty("user.dir") + "/.photo_cache";//缓存路径
        photoLoader = new OptimizedPhotoLoader(cacheDir);

        // 主窗口布局
        BorderPane root = new BorderPane();
        root.setPrefSize(1200, 800);

        // 设置样式
        root.getStyleClass().add("root");

        // 左侧边栏
        VBox sidebar = createSidebar();
        root.setLeft(sidebar);

        // 右侧内容区
        VBox content = createContent();
        root.setCenter(content);

        // 顶部操作栏
        HBox topBar = createTopBar();
        root.setTop(topBar);

        // 初始化界面状态
        updateEditModeUI();

        // 如果有当前联系人，填充信息
        if (currentContact != null) {
            fillContactInfo();
        }

        // 场景和舞台设置
        Scene scene = new Scene(root);

        // 加载CSS文件
        URL cssUrl = getClass().getResource("/style/contact_window.css");
        if (cssUrl == null) {
            System.err.println("CSS文件未找到！");
        } else {
            scene.getStylesheets().add(cssUrl.toExternalForm());
        }

        primaryStage.setTitle("联系人信息界面");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 设置当前编辑的联系人对象
    // @return 无返回值，更新界面显示的联系人信息
    public void setCurrentContact(Contact contact) {
        this.currentContact = contact;
        if (currentContact != null) {
            initPlatformProperties(); // 调用初始化方法
        }
    }

    // 初始化社交平台属性映射
    // 根据当前联系人创建或更新属性绑定
    private void initPlatformProperties() {
        PLATFORM_PROPERTIES = new LinkedHashMap<>();
        if (currentContact == null) {
            // 当 currentContact 为 null 时，初始化空的 StringProperty
            for (String platform : Arrays.asList("微信", "QQ")) {
                PLATFORM_PROPERTIES.put(platform, new SimpleStringProperty(""));
            }
        }
        else {
            // 当 currentContact 不为 null 时，初始化 StringProperty
            PLATFORM_PROPERTIES.put("微信", currentContact.wechatProperty());
            PLATFORM_PROPERTIES.put("QQ", currentContact.QQProperty());
        }
    }

    // 填充联系人信息到界面控件
    // @return 无返回值，从 currentContact 读取数据并显示
    private void fillContactInfo() {
        if (currentContact == null) { // 新增空值检查
            return;
        }
        textFields.get(0).setText(currentContact.getName());
        textFields.get(1).setText(currentContact.getEmail());
        textFields.get(2).setText(currentContact.getMobile());
        textFields.get(3).setText(currentContact.getPhone());
        textFields.get(4).setText(currentContact.getCompany());
        textFields.get(5).setText(currentContact.getHomeAddress());
        textFields.get(6).setText(currentContact.getPostalCode());
        birthPicker.setValue(currentContact.getBirthday());
        if (noteTextArea != null) {
            noteTextArea.setText(currentContact.getRemark()); // 填充备注信息
        }
        // 加载图片
        String photoPath = currentContact.getPhotoPath();
        if (photoPath != null && !photoPath.isEmpty()) {
            // 获取项目根目录下的 images 文件夹路径
            String imagesPath = System.getProperty("user.dir") + "/images";
            File imagesDir = new File(imagesPath);

            // 检查 images 文件夹是否存在
            if (!imagesDir.exists() || !imagesDir.isDirectory()) {
                System.err.println("images 文件夹不存在，请检查路径。");
                return;
            }

            // 拼接完整的图片文件路径
            File imageFile = new File(imagesDir, photoPath);
            System.out.println("尝试加载图片路径: " + imageFile.getAbsolutePath());
            if (imageFile.exists()) {
                // 显示加载指示器（保持原有布局）
                avatarImg.setVisible(false);
                photoLoadingIndicator.setVisible(true);

                // 使用优化的照片加载器（保持原有布局）
                photoLoader.loadPhotoAsync(imageFile, 100, 100)
                        .thenAcceptAsync(optionalImage -> {
                            if (optionalImage.isPresent()) {
                                javafx.application.Platform.runLater(() -> {
                                    avatarImg.setImage(optionalImage.get());
                                    avatarImg.setVisible(true);
                                    photoLoadingIndicator.setVisible(false);
                                });
                            } else {
                                javafx.application.Platform.runLater(() -> {
                                    showAlert("错误", "加载图片失败");
                                    avatarImg.setVisible(true);
                                    photoLoadingIndicator.setVisible(false);
                                });
                            }
                        }, javafx.application.Platform::runLater)
                        .exceptionally(ex -> {
                            System.err.println("Error loading photo: " + ex.getMessage());
                            javafx.application.Platform.runLater(() -> {
                                showAlert("错误", "加载图片时发生异常");
                                avatarImg.setVisible(true);
                                photoLoadingIndicator.setVisible(false);
                            });
                            return null;
                        });
            } else {
                System.err.println("图片文件未找到，请检查路径是否正确。实际路径: " + imageFile.getAbsolutePath());
            }
        }
        updateStarIconColor(); // 填充信息时更新星标颜色
    }

    // 创建顶部操作栏（编辑/收藏/删除/保存按钮）
    // @return 返回 HBox 容器，包含顶部功能按钮
    private HBox createTopBar() {
        HBox topBar = new HBox(15);
        topBar.setPadding(new Insets(10));
        topBar.setAlignment(Pos.CENTER_RIGHT);
        topBar.getStyleClass().add("top-bar");

        // 编辑按钮
        editBtn = new Button("编辑");
        editBtn.getStyleClass().add("edit-btn");
        editBtn.setOnAction(e -> toggleEditMode());

        // 收藏按钮，使用星标图标
        starIcon = new SVGPath();
        starIcon.setContent("M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z");
        starIcon.setFill(Color.WHITE); // 初始为白色
        favoriteBtn = new Button("", starIcon);
        favoriteBtn.getStyleClass().add("favorite-btn");
        favoriteBtn.setOnAction(e -> toggleStarred());
        favoriteBtn.setVisible(false); // 默认隐藏

        // 删除按钮
        deleteBtn = new Button("删除");
        deleteBtn.getStyleClass().add("delete-btn");
        deleteBtn.setOnAction(e -> deleteContact());

        // 保存按钮
        saveBtn = new Button("保存");
        saveBtn.getStyleClass().add("save-btn");
        saveBtn.setOnAction(e -> {
            System.out.println("Save button clicked!"); // 调试信息
            saveContact();
        });
        saveBtn.setVisible(false); // 默认隐藏

        topBar.getChildren().addAll(editBtn, favoriteBtn, deleteBtn, saveBtn);

        return topBar;
    }

    // 创建左侧边栏（照片上传区域）
    // @return 返回 VBox 容器，包含头像、加载指示器和选择按钮
    private VBox createSidebar() {
        VBox sidebar = new VBox(10);
        sidebar.setPadding(new Insets(20));
        sidebar.setPrefWidth(180);
        sidebar.getStyleClass().add("sidebar");

        Label photoLabel = new Label("照片");
        photoLabel.getStyleClass().add("info-label");

        avatarImg = new ImageView();
        avatarImg.setFitWidth(100);
        avatarImg.setFitHeight(100);
        avatarImg.setPreserveRatio(true);

        photoLoadingIndicator = new ProgressIndicator();
        photoLoadingIndicator.setPrefSize(40, 40);
        photoLoadingIndicator.setVisible(false);

        selectPhotoBtn = new Button("选择照片");
        selectPhotoBtn.getStyleClass().add("select-photo-btn");
        selectPhotoBtn.setOnAction(e -> selectPhoto());
        selectPhotoBtn.setVisible(true);

        sidebar.getChildren().addAll(photoLabel, avatarImg, photoLoadingIndicator, selectPhotoBtn);
        return sidebar;
    }

    // 打开文件选择器选择照片并加载
    // 异步加载选中的照片并更新头像显示
    private void selectPhoto() {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("选择照片");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("图片文件", "*.png", "*.jpg", "*.jpeg"),
                new FileChooser.ExtensionFilter("所有文件", "*.*")
        );

        // 设置初始目录（保持原有布局）
        String imagesPath = System.getProperty("user.dir") + "/images";
        File imagesDir = new File(imagesPath);
        if (imagesDir.exists() && imagesDir.isDirectory()) {
            fileChooser.setInitialDirectory(imagesDir);
        } else {
            System.err.println("images 文件夹不存在，请检查路径。");
        }

        File selectedFile = fileChooser.showOpenDialog(primaryStage);
        if (selectedFile != null) {
            // 显示加载指示器（保持原有布局）
            avatarImg.setVisible(false);
            photoLoadingIndicator.setVisible(true);

            // 使用优化的照片加载器（保持原有布局）
            photoLoader.loadPhotoAsync(selectedFile, 100, 100)
                    .thenAcceptAsync(optionalImage -> {
                        if (optionalImage.isPresent()) {
                            javafx.application.Platform.runLater(() -> {
                                avatarImg.setImage(optionalImage.get());
                                avatarImg.setVisible(true);
                                photoLoadingIndicator.setVisible(false);

                                String relativePath = imagesDir.toURI().relativize(selectedFile.toURI()).getPath();
                                currentContact.setPhotoPath(relativePath);
                            });
                        } else {
                            javafx.application.Platform.runLater(() -> {
                                showAlert("错误", "加载图片失败");
                                avatarImg.setVisible(true);
                                photoLoadingIndicator.setVisible(false);
                            });
                        }
                    }, javafx.application.Platform::runLater)
                    .exceptionally(ex -> {
                        System.err.println("Error loading photo: " + ex.getMessage());
                        javafx.application.Platform.runLater(() -> {
                            showAlert("错误", "加载图片时发生异常");
                            avatarImg.setVisible(true);
                            photoLoadingIndicator.setVisible(false);
                        });
                        return null;
                    });
        }
    }

    // 创建右侧内容区（联系人信息表单）
    // @return 返回 VBox 容器，包含联系人信息网格和备注区域
    private VBox createContent() {
        VBox content = new VBox(15);
        content.setPadding(new Insets(20));
        content.getStyleClass().add("content");

        infoGrid = new GridPane();
        infoGrid.setHgap(20);
        infoGrid.setVgap(20);
        infoGrid.setAlignment(Pos.CENTER_LEFT);

        // 初始化社交平台属性
        initPlatformProperties();

        // 用户基本信息
        infoGrid.setHgap(20); // 相邻列的控件间隔
        infoGrid.setVgap(25); // 相邻行的控件间隔
        infoGrid.setAlignment(Pos.CENTER_LEFT);
        infoGrid.getStyleClass().add("info-grid");

        // 姓名
        Label nameLabel = new Label("姓名：");
        nameLabel.getStyleClass().add("info-label");
        TextField nameField = new TextField();
        nameField.getStyleClass().add("info-text-field");
        nameField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setName(newText);
            }
        });
        textFields.add(nameField);

        // 电子邮箱
        Label emailLabel = new Label("电子邮箱：");
        emailLabel.getStyleClass().add("info-label");
        TextField emailField = new TextField();
        emailField.getStyleClass().add("info-text-field");
        emailField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setEmail(newText);
            }
        });
        // 添加实时验证
        emailField.textProperty().addListener((observable, oldValue, newValue) -> {
            if(newValue !=null){
                if (!newValue.isEmpty() &&!RegexValidator.validate(newValue, RegexValidator.EMAIL_REGEX)) {
                    emailField.setStyle("-fx-border-color: red;");
                } else {
                    emailField.setStyle("");
                }
            }

        });
        textFields.add(emailField);
        infoGrid.addRow(0, nameLabel, nameField, emailLabel, emailField);

        // 手机号码
        Label phoneLabel = new Label("手机号码：");
        phoneLabel.getStyleClass().add("info-label");
        TextField phoneField = new TextField();
        phoneField.getStyleClass().add("info-text-field");
        phoneField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setMobile(newText);
            }
        });
        // 添加实时验证
        phoneField.textProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue.isEmpty() && !RegexValidator.validate(newValue, RegexValidator.MOBILE_REGEX)) {
                phoneField.setStyle("-fx-border-color: red;");
            } else {
                phoneField.setStyle("");
            }
        });
        textFields.add(phoneField);

        // 固定电话
        Label telLabel = new Label("固定电话：");
        TextField telField = new TextField();
        telField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setPhone(newText);
            }
        });
        // 添加实时验证
        telField.textProperty().addListener((observable, oldValue, newValue) -> {
            if(newValue!=null){
                if (!newValue.isEmpty() && !RegexValidator.validate(newValue, RegexValidator.TEL_REGEX)) {
                    telField.setStyle("-fx-border-color: red;");
                } else {
                    telField.setStyle("");
                }

            }

        });
        textFields.add(telField);

        infoGrid.addRow(1, phoneLabel, phoneField, telLabel, telField);

        // 分割线
        Separator separator = new Separator();
        infoGrid.add(separator, 0, 2, 4, 1);

        // 社交平台联系方式标题
        infoGrid.add(new Label("社交平台联系方式："), 0, 3, 2, 1); // 跨两列显示

        // 工作单位
        Label workUnitLabel = new Label("工作单位：");
        TextField workUnitField = new TextField();
        workUnitField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setCompany(newText);
            }
        });
        textFields.add(workUnitField);

        // 家庭住址
        Label homeAddrLabel = new Label("家庭住址：");
        TextField homeAddrField = new TextField();
        homeAddrField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setHomeAddress(newText);
            }
        });
        textFields.add(homeAddrField);

        // 邮编
        Label zipLabel = new Label("邮编：");
        TextField zipField = new TextField();
        zipField.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setPostalCode(newText);
            }
        });
        // 添加实时验证
        zipField.textProperty().addListener((observable, oldValue, newValue) -> {
            if(newValue!=null){
                if (!newValue.isEmpty() && !RegexValidator.validate(newValue, RegexValidator.POSTCODE_REGEX)) {
                    zipField.setStyle("-fx-border-color: red;");
                } else {
                    zipField.setStyle("");
                }
            }

        });
        textFields.add(zipField);

        // 生日
        Label birthLabel = new Label("生日：");
        birthPicker = new DatePicker();
        birthPicker.valueProperty().addListener((obs, oldValue, newValue) -> {
            if (isEditMode) {
                currentContact.setBirthday(newValue);
            }
        });

        // 将所有剩余字段添加到GridPane
        // 工作单位
        infoGrid.addRow(5, workUnitLabel, workUnitField);
        // 家庭住址
        infoGrid.addRow(6, homeAddrLabel, homeAddrField);
        // 邮编
        infoGrid.addRow(7, zipLabel, zipField);
        // 生日
        infoGrid.addRow(8, birthLabel, birthPicker);

        initSocialPlatformTable();

        // 备注 (使用单独的容器，因为需要Accordion)
        Accordion accordion = new Accordion();
        accordion.getStyleClass().add("accordion");

        noteTextArea = new TextArea();
        TitledPane note = new TitledPane("备注", noteTextArea);
        note.getStyleClass().add("titled-pane");

        noteTextArea.textProperty().addListener((obs, oldText, newText) -> {
            if (isEditMode) {
                currentContact.setRemark(newText);
            }
        });

        accordion.getPanes().addAll(note);
        accordion.setExpandedPane(note);

        // 将GridPane和备注Accordion添加到主容器
        content.getChildren().addAll(infoGrid, accordion);

        return content;
    }

    // 切换编辑模式（可编辑/只读状态）
    // @return 无返回值，更新界面控件的可编辑状态和按钮可见性
    private void toggleEditMode() {
        isEditMode = !isEditMode;
        System.out.println("Toggle edit mode: " + isEditMode);

        // 如果是新建联系人且 currentContact 为 null，则初始化一个新的 Contact 对象
        if (isEditMode && currentContact == null) {
            currentContact = new Contact();
            initPlatformProperties(); // 确保初始化社交平台属性映射
            System.out.println("Initialized a new Contact object for editing.");
        }

        updateEditModeUI();
    }

    // 更新编辑模式下的界面状态
    // @return 无返回值，设置控件的可编辑性、样式和按钮显示
    private void updateEditModeUI() {
        // 更新文本字段的可编辑状态和样式
        for (TextField textField : textFields) {
            textField.setEditable(isEditMode);
            textField.setStyle(isEditMode ? "-fx-border-color: transparent;" : "-fx-border-color: black;");
        }

        // 确保 PLATFORM_PROPERTIES 已初始化
        if (PLATFORM_PROPERTIES != null) {
            PLATFORM_PROPERTIES.values().forEach(property -> {
                TextField field = (TextField) ((StringProperty) property).getBean(); // 获取绑定的文本框
                if (field != null) {
                    field.setEditable(isEditMode);
                }
            });
        }

        // 更新组合框的可编辑状态（可能需要检查 contactType 是否为 null，避免其他空指针）
        if (contactType != null) {
            contactType.setDisable(!isEditMode);
        }

        // 更新日期选择器的可编辑状态
        birthPicker.setDisable(!isEditMode);
        //更新备注信息的可编辑状态
        noteTextArea.setEditable(isEditMode);

        //更新照片选择按钮的可用性
        selectPhotoBtn.setDisable(!isEditMode);

        // 更新按钮可见性
        editBtn.setVisible(!isEditMode);
        favoriteBtn.setVisible(!isEditMode);
        deleteBtn.setVisible(!isEditMode);
        saveBtn.setVisible(isEditMode);

        // 更新社交平台输入框
        initSocialPlatformTable();
    }

    // 保存联系人信息到数据库
    // @return 无返回值，校验字段后执行创建或更新操作
    private void saveContact() {
        System.out.println(currentContact);
        if (isEditMode && currentContact != null) {
            // 校验必填字段（姓名、手机号）
            if (textFields.get(0).getText().isEmpty() || textFields.get(2).getText().isEmpty()) {
                showAlert("错误", "姓名和手机号码不能为空");
                return;
            }
            // 手机号格式验证
            String mobile = textFields.get(2).getText();
            if (!RegexValidator.validate(mobile, RegexValidator.MOBILE_REGEX)) {
                showAlert("格式错误", "手机号码格式不正确（例：13812345678）");
                textFields.get(2).requestFocus(); // 聚焦错误字段
                return;
            }
            // 邮箱格式验证
            String email = textFields.get(1).getText();
            if(email !=null){
                if (!email.isEmpty() && !RegexValidator.validate(email, RegexValidator.EMAIL_REGEX)) {
                    showAlert("格式错误", "邮箱地址格式不正确（例：user@example.com）");
                    textFields.get(1).requestFocus();
                    return;
                }
            }
            // 固定电话格式验证
            String tel = textFields.get(3).getText();
            if(tel !=null){
                if (!tel.isEmpty() && !RegexValidator.validate(tel, RegexValidator.TEL_REGEX)) {
                    showAlert("格式错误", "固定电话格式不正确（例：010-12345678 或 12345678）");
                    textFields.get(3).requestFocus();
                    return;
                }
            }
            // 邮编格式验证
            String postcode = textFields.get(6).getText();
            if(postcode!=null){
                if (!postcode.isEmpty() &&!RegexValidator.validate(postcode, RegexValidator.POSTCODE_REGEX)) {
                    showAlert("格式错误", "邮编应为6位数字（例：200000）");
                    textFields.get(6).requestFocus();
                    return;
                }
            }
            // 更新联系人信息（除了社交平台和备注）
            if (true) {
                currentContact.setName(textFields.get(0).getText());
                currentContact.setEmail(email);
                currentContact.setMobile(mobile);
                currentContact.setPhone(tel);
                currentContact.setCompany(textFields.get(4).getText());
                currentContact.setHomeAddress(textFields.get(5).getText());
                currentContact.setPostalCode(postcode);
                currentContact.setBirthday(birthPicker.getValue());
            }
            // 更新社交平台信息
            if (PLATFORM_PROPERTIES != null) {
                for (Map.Entry<String, StringProperty> entry : PLATFORM_PROPERTIES.entrySet()) {
                    String platform = entry.getKey();
                    String account = entry.getValue().get(); // 直接获取绑定的值
                    currentContact.setImAccount(platform, account);
                }
            }
            // 更新备注信息
            if (noteTextArea != null) {
                currentContact.setRemark(noteTextArea.getText());
            }
            try {
                System.out.println("Attempting to save contact: " + currentContact.getName());
                boolean success = false;
                if (currentContact.getId() > 0) {
                    success = contactManager.updateContact(currentContact);
                    if (success) {
                        showAlert("成功", "联系人信息已更新");
                    } else {
                        showAlert("错误", "更新联系人信息失败");
                    }
                } else {
                    success = contactManager.createContact(currentContact);
                    if (success) {
                        showAlert("成功", "新联系人已创建");
                    } else {
                        showAlert("错误", "创建联系人失败");
                    }
                }
                // 触发保存事件
                if (success && contactSavedListener != null) {

                    System.out.println("触发联系人保存监听器，通知 MainApp 更新数据");
                    contactSavedListener.onContactSaved();
                    // 关闭窗口
                    Stage stage = (Stage) saveBtn.getScene().getWindow();
                    stage.close();
                }
            } catch (Exception e) {
                showAlert("错误", "保存联系人信息时出现问题：" + e.getMessage());
                e.printStackTrace();
            }
        }
    }

    // 删除当前选中的联系人
    // @return 无返回值，执行数据库删除操作并清空界面
    private void deleteContact() {
        if (currentContact != null) {
            System.out.println("开始删除联系人: " + currentContact.getName() + ", ID: " + currentContact.getId());
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("确认删除");
            alert.setHeaderText("确定要删除此联系人吗？");
            alert.setContentText("此操作不可撤销。");

            Optional<ButtonType> result = alert.showAndWait();
            if (result.isPresent() && result.get() == ButtonType.OK) {
                try {
                    System.out.println("用户确认删除，开始执行删除操作");
                    boolean isDeleted = contactManager.deleteContact(currentContact.getId());
                    if (isDeleted) {
                        System.out.println("联系人删除成功");
                        showAlert("成功", "联系人已删除");
                        // 清空输入框
                        for (TextField textField : textFields) {
                            textField.clear();
                        }
                        birthPicker.setValue(null);
                        contactType.getSelectionModel().select("微信");
                        currentContact = null;

                        // 触发保存事件，通知 MainApp 更新数据
                        if (contactSavedListener != null) {
                            System.out.println("准备触发联系人保存监听器，通知 MainApp 更新数据");
                            contactSavedListener.onContactSaved();
                            System.out.println("联系人保存监听器已触发");
                        } else {
                            System.out.println("警告：contactSavedListener 为 null，无法通知 MainApp 更新数据");
                        }
                        // 关闭窗口
                        Stage stage = (Stage) deleteBtn.getScene().getWindow();
                        stage.close();
                        System.out.println("联系人窗口已关闭");
                    } else {
                        System.out.println("联系人删除失败");
                        showAlert("错误", "删除联系人失败");
                    }
                } catch (Exception e) {
                    System.out.println("删除联系人时发生异常: " + e.getMessage());
                    e.printStackTrace();
                    showAlert("错误", "删除联系人时出现问题：" + e.getMessage());
                }
            } else {
                System.out.println("用户取消删除操作");
            }
        } else {
            System.out.println("警告：尝试删除联系人时 currentContact 为 null");
        }
    }

    // 切换联系人星标（收藏）状态
    // @return 无返回值，更新数据库和界面星标图标颜色
    private void toggleStarred() {
        // 检查当前联系人是否为空
        if (currentContact == null) {
            showAlert("错误", "当前没有选中的联系人");
            return;
        }

        try {
            // 切换收藏状态
            boolean newStarredStatus = !currentContact.isStarred();
            currentContact.setStarred(newStarredStatus);
            updateStarIconColor(); // 更新星标颜色

            System.out.println("尝试更新联系人收藏状态，联系人 ID: " + currentContact.getId());
            boolean success = contactManager.updateContact(currentContact);
            if (success) {
                showAlert("成功", "联系人已" + (newStarredStatus ? "收藏" : "取消收藏"));
            } else {
                // 若更新失败，恢复原状态
                currentContact.setStarred(!newStarredStatus);
                showAlert("错误", "更新收藏状态失败");
            }
        } catch (Exception e) {
            // 捕获异常并提示用户
            showAlert("错误", "操作收藏状态时出现问题：" + e.getMessage());
            e.printStackTrace();
        }
    }

    // 更新星标图标的颜色（金色/白色）
    // @return 无返回值，根据联系人收藏状态设置图标颜色
    private void updateStarIconColor() {
        if (currentContact != null) {
            starIcon.setFill(currentContact.isStarred() ? Color.GOLD : Color.WHITE);
        }
    }

    // 显示提示对话框
    private void showAlert(String title, String content) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(content);
        alert.showAndWait();
    }

    // 初始化社交平台表格
    private void initSocialPlatformTable() {
        GridPane socialGrid = new GridPane();
        socialGrid.setHgap(10);
        socialGrid.setVgap(3);
        socialGrid.setPadding(new Insets(8));
        socialGrid.setMaxWidth(300);
        socialGrid.setStyle(
                "-fx-border-color: #e0e0e0; " +
                        "-fx-border-width: 1px; " +
                        "-fx-background-color: white; " +
                        "-fx-border-radius: 4px;"
        );

        // 列约束
        ColumnConstraints platformCol = new ColumnConstraints();
        platformCol.setPercentWidth(90);
        ColumnConstraints accountCol = new ColumnConstraints();
        accountCol.setPercentWidth(210);

        socialGrid.getColumnConstraints().addAll(platformCol, accountCol);

        // 标题行（固定展示模式）
        Label platformLabel = new Label("社交平台");
        platformLabel.getStyleClass().add("table-header");
        Label accountLabel = new Label("账号");
        accountLabel.getStyleClass().addAll("table-header");

        socialGrid.add(platformLabel, 0, 0);
        socialGrid.add(accountLabel, 1, 0);

        // 存储可编辑的账号输入框（用于切换模式）
        List<TextField> accountFields = new ArrayList<>();

        // 平台列表
        List<String> platforms = Arrays.asList("微信", "QQ");
        for (int i = 0; i < platforms.size(); i++) {
            String platform = platforms.get(i);

            // 平台名称
            Label platformNameLabel = new Label(platform);
            platformNameLabel.getStyleClass().add("table-text-label");

            // 账号控件：编辑模式用TextField，展示模式用Label
            Node accountControl;
            if (isEditMode) {
                TextField accountField = new TextField();
                accountField.textProperty().bindBidirectional(PLATFORM_PROPERTIES.get(platform));
                accountField.getStyleClass().add("table-text-field");
                accountControl = accountField;
                accountFields.add(accountField); // 保存可编辑控件
            } else {
                Label accountLabelView = new Label();
                accountLabelView.textProperty().bind(PLATFORM_PROPERTIES.get(platform));
                accountLabelView.getStyleClass().add("table-text-label");
                accountControl = accountLabelView;
            }

            // 行容器
            GridPane rowGrid = new GridPane();
            rowGrid.getColumnConstraints().addAll(platformCol, accountCol); // 应用列约束
            rowGrid.add(platformNameLabel, 0, 0);
            rowGrid.add(accountControl, 1, 0);

            // 行样式
            String defaultStyle = i % 2 == 0 ? "-fx-background-color: #f8f9fa;" : "-fx-background-color: white;";
            rowGrid.setStyle(defaultStyle);
            socialGrid.add(rowGrid, 0, i + 1, 2, 1);
        }

        // 保存账号输入框列表，用于切换模式时更新状态
        this.accountFields = accountFields;
        infoGrid.add(socialGrid, 0, 4, 4, 1);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

// 新增正则表达式验证工具类
class RegexValidator {
    // 中国手机号（11位，1开头+3-9第二位）
    public static final String MOBILE_REGEX = "^1[3-9]\\d{9}$";
    // 邮箱（标准格式，支持多级域名）
    public static final String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}(?:\\.[a-zA-Z]{2,})?$";
    // 固定电话（带区号或本地号码，支持分隔符）
    public static final String TEL_REGEX = "^(\\+\\d{1,3}[- ]?)?(\\(\\d{3,4}\\)|\\d{3,4}[- ]?)?\\d{7,8}$";
    // 中国邮编（6位数字）
    public static final String POSTCODE_REGEX = "^\\d{6}$";

    // 验证方法
    public static boolean validate(String input, String regex) {
        return input != null && !input.isEmpty() && input.matches(regex);
    }
}